home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / umich / diskutil / gemar220.lzh / GEMAR220 / PLUGIN / SOURCE / QFA.M < prev    next >
Encoding:
Text File  |  1994-02-12  |  6.9 KB  |  223 lines

  1. (*-------------------------------------------------------------------------*)
  2. (*-                                                                                                                                             -*)
  3. (*-     Name                        : QFA                                                                                             -*)
  4. (*-     Version                 : 1.000                                                                                         -*)
  5. (*-     Art                         : Module                                                                                        -*)
  6. (*-     Aufgabe                 : PlugIn für GEMAR                                                                    -*)
  7. (*-     Autor                     : Steffen Engel                                             (C) 93                -*)
  8. (*-     Letzte Änderung : 27.10.1993, 12:35:52                                                            -*)
  9. (*-                                                                                                                                             -*)
  10. (*-------------------------------------------------------------------------*)
  11. (*-------------------------------------------------------------------------*)
  12. (*-                                                                                                                                             -*)
  13. (*- Beschreibung    : Adaption der QFA-Kommandos an problematische                    -*)
  14. (*-                                 Streamer.                                                                                         -*)
  15. (*-                                 Dieses ist für Locate auf TDC 4200 mit SCSI-2-Firm-      *)
  16. (*-                                 ware                                                                                                    -*)
  17. (*-                                                                                                                                             -*)
  18. (*-------------------------------------------------------------------------*)
  19. (*-------------------------------------------------------------------------*)
  20. (*-                                                                                                                                             -*)
  21. (*-     History                                                                                                                         -*)
  22. (*-                                                                                                                                             -*)
  23. (*-                                                                                                                                             -*)
  24. (*-     Vers | Datum        | Beschreibung                                                                            -*)
  25. (*-  ------|----------|---------------------------------------                        -*)
  26. (*-     1.0  | 17.12.93 | erstellt                                                                                    -*)
  27. (*-              |                    |                                                                                                     -*)
  28. (*-                                                                                                                                             -*)
  29. (*-                                                                                                                                             -*)
  30. (*-                                                                                                                                             -*)
  31. (*-------------------------------------------------------------------------*)
  32. MODULE QFA;
  33.  
  34. IMPORT SYSTEM, CPX;
  35. FROM SYSTEM IMPORT BYTE;
  36.  
  37. (* Magic-Lib *)
  38. FROM MagicSys     IMPORT
  39.                                 (* Const *) Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5,
  40.                                                         Bit6, Bit7, Bit8, Bit9, Bit10, Bit11, Bit12,
  41.                                                         Bit13, Bit14, Bit15,
  42.                                 (* Type  *) LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
  43.                                                         sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET;
  44.  
  45. IMPORT void;
  46.  
  47. IMPORT PlugParms;
  48.  
  49. TYPE
  50.         tSpacePrivate  = RECORD
  51.                                             Version : SHORTCARD;
  52.                                             (*$K+*)
  53.                                             In    : PROCEDURE ((* Cmd      *) SYSTEM.ADDRESS,
  54.                                                                              (* CmdLen *) SHORTCARD,
  55.                                                                              (* Buffer *) SYSTEM.ADDRESS,
  56.                                                                              (* Transferlen *)    LONGCARD,
  57.                                                                              (* CmdTimeout *) LONGCARD,
  58.                                                                              (* DataTimeout *) LONGCARD) : SHORTCARD;
  59.                                             Out : PROCEDURE ((* Cmd      *) SYSTEM.ADDRESS,
  60.                                                                              (* CmdLen *) SHORTCARD,
  61.                                                                              (* Buffer *) SYSTEM.ADDRESS,
  62.                                                                              (* Transferlen *)    LONGCARD,
  63.                                                                              (* CmdTimeout *) LONGCARD,
  64.                                                                              (* DataTimeout *) LONGCARD) : SHORTCARD;
  65.                                             (*$K=*)
  66.                                         END;
  67.          tpSpacePrivate = POINTER TO tSpacePrivate;
  68.  
  69.  
  70. VAR PlugEnv : PlugParms.tpPlugEnvironment;
  71.  
  72. TYPE tpQFAParms = POINTER TO tQFAParms;
  73.  
  74.          tQFAParms    = RECORD
  75.                                         Opcode        : SHORTCARD;                (* 1 = Position lesen
  76.                                                                                                      * 2 = Position ansteuern *)
  77.                                         Imed            : SHORTCARD;
  78.                                         BlockAdr    : POINTER TO LONGCARD;
  79.                                     END;
  80.  
  81.          tCmdBlock        = RECORD
  82.                                             Command : BYTE;
  83.                                             Lun         : BYTE;
  84.                                             Adr         : LONGCARD;
  85.                                             Zero        : BYTE;
  86.                                             LenHigh : BYTE;
  87.                                             LenLow    : BYTE;
  88.                                             Flags     : BYTE; 
  89.                                         END;
  90.  
  91.  
  92. (*------------------------------------------------------------------*)
  93. (*-                                                                                                                              -*)
  94. (*- Blockadresse von Streamer holen                                                              -*)
  95. (*-                                                                                                                              -*)
  96. (*------------------------------------------------------------------*)
  97. PROCEDURE BlockAdr(VAR BlockAdr : LONGCARD) : LONGINT;
  98.  
  99. TYPE tPositionData = RECORD
  100.  
  101.                                              Flags         : BYTE;    (* BOP, EOP, Res, Res, Res, BDU, Res, Res *)
  102.  
  103.                                              part          : BYTE;
  104.  
  105.                                              Res1          : BYTE;
  106.  
  107.                                              Res2          : BYTE;
  108.  
  109.                                              FirstLoc  : LONGCARD;
  110.  
  111.                                              LastLoc     : LONGCARD;
  112.  
  113.                                              Res3          : BYTE;
  114.  
  115.                                              NBlBuff2  : BYTE;
  116.  
  117.                                              NBlBuff1  : BYTE;
  118.  
  119.                                              NBlBuff0  : BYTE;
  120.  
  121.                                              BuffBytes : LONGCARD;
  122.  
  123.                                          END;
  124.  
  125. (*$? SYSTEM.TSIZE(tPositionData) # 20 : Fragezeichen? *)
  126.  
  127.  
  128. VAR PositionData    : tPositionData;
  129.  
  130.         CmdBlock            : tCmdBlock;
  131.  
  132.         retCode             : SHORTCARD;
  133.  
  134.  
  135.     BEGIN
  136.  
  137.         WITH CmdBlock DO
  138.  
  139.             Command := BYTE(034H);                 (* Read Position *)
  140.  
  141.             Adr         := 0;
  142.  
  143.             Lun         := BYTE(1);                      (* Genau hierum geht es!
  144.  
  145.                                                                             * TDC kann nur Read Position mit BT = 1 *)
  146.  
  147.             Zero        := BYTE(0);
  148.  
  149.             LenHigh := BYTE(0);
  150.  
  151.             LenLow    := BYTE(0);
  152.  
  153.             Flags     := BYTE(0);
  154.  
  155.         END;
  156.  
  157.  
  158.         retCode := tpSpacePrivate(PlugEnv^.Private)^.In(SYSTEM.ADR(CmdBlock), 10,
  159.  
  160.                                                                         SYSTEM.ADR(PositionData), SIZE(PositionData),
  161.  
  162.                                                                         300, 300);
  163.  
  164.  
  165.         (* Antwort umkopieren *)
  166.  
  167.         BlockAdr := PositionData.FirstLoc;
  168.  
  169.  
  170.         (* und fertig *)
  171.  
  172.         RETURN VAL(LONGINT, retCode);
  173.  
  174.  
  175.     END BlockAdr;
  176.  
  177.  
  178. (*------------------------------------------------------------------*)
  179. (*-                                                                                                                              -*)
  180. (*- Blockadresse auf Streamer anspringen                                                     -*)
  181. (*-                                                                                                                              -*)
  182. (*------------------------------------------------------------------*)
  183. PROCEDURE SeekBlock(Imed : BOOLEAN; BlockAdr : LONGCARD) : LONGINT;
  184.  
  185.  
  186. TYPE tLoc = RECORD
  187.  
  188.                                  Command : BYTE;
  189.  
  190.                                  Lun         : BYTE;
  191.  
  192.                                  Res1      : BYTE;
  193.  
  194.                                  Adr3      : BYTE;
  195.  
  196.                                  Adr2      : BYTE;
  197.  
  198.                                  Adr1      : BYTE;
  199.  
  200.                                  Adr0      : BYTE;
  201.  
  202.                                  Res2      : BYTE;
  203.  
  204.                                  part      : BYTE;
  205.  
  206.                                  Flags     : BYTE; 
  207.  
  208.                              END;
  209.  
  210.  
  211. VAR Cmd                      : tLoc;
  212.  
  213.         Ok                         : BOOLEAN;
  214.  
  215.  
  216.     BEGIN
  217.  
  218.  
  219.         (* Kommandoblock zusammensetzen *)
  220.  
  221.         WITH Cmd DO
  222.  
  223.             Command:=BYTE(02BH);
  224.  
  225.  
  226.             IF Imed
  227.  
  228.                 THEN
  229.  
  230.                     (* Bit setzen *)
  231.  
  232.                     Lun := BYTE(1);
  233.  
  234.                 ELSE
  235.  
  236.                     Lun := BYTE(0);
  237.  
  238.                 END;
  239.  
  240.  
  241.             Res1 := BYTE( 0);
  242.  
  243.  
  244.             (* Adresse einkopieren *)
  245.  
  246.             Adr3    := BYTE(VAL(CHAR, BlockAdr DIV 01000000H));
  247.  
  248.             Adr2    := BYTE(VAL(CHAR, BlockAdr DIV 010000H MOD 0100H));
  249.  
  250.             Adr1    := BYTE(VAL(CHAR, BlockAdr DIV 0100H MOD 0100H));
  251.  
  252.             Adr0    := BYTE(VAL(CHAR, BlockAdr MOD 0100H));
  253.  
  254.             Res2    := BYTE(0);
  255.  
  256.             part    := BYTE(0);
  257.  
  258.             Flags := BYTE(0);
  259.  
  260.         END;
  261.  
  262.         RETURN VAL(LONGINT,
  263.  
  264.                              tpSpacePrivate(PlugEnv^.Private)^.Out(SYSTEM.ADR(Cmd), 10,
  265.  
  266.                              NIL, 0, 1200*100, 1200*100));
  267.  
  268.  
  269.     END SeekBlock;
  270.  
  271.  
  272. (*$K+ $E+ *)
  273. PROCEDURE CallPlug(parms : tpQFAParms) : LONGINT;
  274.  
  275.  
  276.     BEGIN
  277.  
  278.         IF parms^.Opcode = 1
  279.  
  280.             THEN
  281.  
  282.                 RETURN BlockAdr(parms^.BlockAdr^);
  283.  
  284.             ELSE
  285.  
  286.                 RETURN SeekBlock(parms^.Imed = 1, parms^.BlockAdr^);
  287.  
  288.             END;
  289.  
  290.     END CallPlug;
  291. (*$K= $E+ *)
  292.  
  293.  
  294. BEGIN
  295.  
  296.     PlugEnv := PlugParms.tpPlugEnvironment(CPX.pXCPB);
  297.  
  298.     IF tpSpacePrivate(PlugEnv^.Private)^.Version # 0101H
  299.         THEN
  300.             void.I := PlugEnv^.Alert(1, '[3][PlugIn: QFA-Installation:|falsche Parameterversion][Aha]');
  301.         ELSE
  302.             CPX.Return(SYSTEM.ADDRESS(CallPlug));
  303.         END;
  304.  
  305. END QFA.
  306.         
  307.     
  308.